<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        //  输出结果

        /*
        1. a提升，function b 提升，正常应该是得到 a=undefined, function b
           但是实际是， a=undefiend, b=undefined
        2. 进入if,产生块级作用域，在块级作用域，变量函数提升得到
         a=function a ,b=function b
 
         因此输出 a 为function a
 
         3. 运行 a= 5
          给块级作用域中 a=funtion a 替换为a=5
 
          4.运行funtion a(){}
          奇怪现象，这时候会把当前块级的 a=5,赋值给全局a=undefiend，使得a=5
          同样运行function b(){}时候也会给全局b赋值，由于当前块级b=function b, 全局也变成function b
          5. 运行a=0
          替换块级a =0
 
          6. if运行结束，此时 全局 a=5, b=function b, 因此后面输出就是该结果
 
        */

        var a;
        if (true) { // 现在浏览器都支持es6，因此实际上会产生块级作用域
            console.log('[ a ] >', a)
            a = 5 // 给块级a=5
            function a() { } // 这时候会把当前块级的 a=5,赋值给全局a=undefiend，使得a=5
            function b() { } // 会给全局b赋值，由于当前块级b=function b, 全局也变成function b

            a = 0

            console.log('[ a ] >', a)
        }

        console.log('[ a ] >', a)
        console.log('[ b ] >', b)



    </script>
</body>

</html>